/*-------------------------------------------------------------------------
 *
 * sync.h
 *	  文件同步管理代码。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/storage/sync.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef SYNC_H
#define SYNC_H

#include "storage/relfilenode.h"

/*
 * 同步请求的类型。这些用于管理待处理请求的集合，以便在下一个检查点调用同步处理程序的同步或取消链接函数。
 */
typedef enum SyncRequestType
{
	SYNC_REQUEST,				/* 安排调用同步函数 */
	SYNC_UNLINK_REQUEST,		/* 安排调用取消链接函数 */
	SYNC_FORGET_REQUEST,		/* 忘记所有特定标签的调用 */
	SYNC_FILTER_REQUEST			/* 忘记所有符合匹配函数的调用 */
} SyncRequestType;

/*
 * 处理给定请求时使用的函数集。枚举值必须与 sync.c 中函数表的索引匹配。
 */
typedef enum SyncRequestHandler
{
	SYNC_HANDLER_MD = 0,
	SYNC_HANDLER_CLOG,
	SYNC_HANDLER_COMMIT_TS,
	SYNC_HANDLER_MULTIXACT_OFFSET,
	SYNC_HANDLER_MULTIXACT_MEMBER,
	SYNC_HANDLER_NONE
} SyncRequestHandler;

/*
 * 标识文件的标签。目前它具有 md.c 使用所需的成员，但 sync.c 对内部结构没有了解，且可能会根据未来处理程序的需要而改变。
 */
typedef struct FileTag
{
	int16		handler;		/* SyncRequestHandler 值，节省空间 */
	int16		forknum;		/* ForkNumber，节省空间 */
	RelFileNode rnode;
	uint32		segno;
} FileTag;

extern void InitSync(void);
extern void SyncPreCheckpoint(void);
extern void SyncPostCheckpoint(void);
extern void ProcessSyncRequests(void);
extern void RememberSyncRequest(const FileTag *ftag, SyncRequestType type);
extern bool RegisterSyncRequest(const FileTag *ftag, SyncRequestType type,
								bool retryOnError);

#endif							/* SYNC_H */
